/**
 * @author Your Name
 * @version 1.0
 *
 * @description <p>LogonController是登录界面控制器类，负责处理用户登录、注册、忘记密码以及登录成功后进入游戏主界面等逻辑。</p>
 */
package com.example.mychess;

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.Socket;
import java.util.Optional;

import static com.example.mychess.TableController.mmgg;

public class LogonController {

    // 登录窗口引用
    public static Stage stage = new Stage();
    // 主游戏窗口引用
    public static Stage st = new Stage();
    // 当前登录用户对象
    public static User myUser = new User();
    // 账号输入框组件
    public TextField AccountText;
    // 密码输入框组件
    public PasswordField PasswordText;
    // 与服务器通信的Socket对象
    public static Socket socket;
    // 接收自服务器的数据数组
    public static int[] a;

    /**
     * 初始化方法，在FXML加载完成后调用，创建本地Socket连接到服务器
     */
    @FXML
    private void initialize() {
        if (socket == null) {
            socket = SocketUtil.createLocalHost(8080);
        }
    }

    /**
     * 处理登录操作，获取账号和密码信息并发送给服务器进行验证，
     * 根据服务器响应展示相应的提示信息，并在登录成功后切换至游戏主界面
     */
    public void Logon() {
        String account = AccountText.getText();
        String password = PasswordText.getText();
        User user = new User(account, password);
        Message message = new Message();
        message.setType(Message.Type.LOGIN);
        message.setFrompassword(password);
        message.setFrom(account);

        SocketUtil.send(socket, message);
        Object receive = SocketUtil.receive(socket);
        System.out.println(((Message) receive).getContent());

        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("提示");

        if (((Message) receive).getType() == Message.Type.SUCCESS) {
            myUser = ((Message) receive).getUser();
            a = ((Message) receive).getA();
            alert.setHeaderText("登录成功");
            alert.setContentText("欢迎登录");

            Optional<ButtonType> result = alert.showAndWait();
            if (result.get() == ButtonType.OK) {
                message.setType(Message.Type.A);
                SocketUtil.send(socket, message);
                stage.hide();
                LogTable();
            }
        } else if (((Message) receive).getType() == Message.Type.FAILURE) {
            alert.setHeaderText("登录失败");
            alert.setContentText("用户名或密码错误");
            alert.show();
        }
    }

    /**
     * 登录成功后打开游戏主界面（table.fxml）
     */
    public void LogTable() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("table.fxml"));
        Scene scene = null;
        try {
            scene = new Scene(fxmlLoader.load(), 600, 500);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        st.setTitle(AccountText.getText());
        st.setScene(scene);
        st.setOnCloseRequest(event -> {
            // 在这里添加关闭窗口前需要执行的逻辑
            event.consume();
            mmgg.setType(Message.Type.LEAVE);
            mmgg.setFrom(st.getTitle());
            SocketUtil.send(socket, mmgg);
            stage.close();
            st.close();
            Platform.exit();
        });
        st.show();
    }

    /**
     * 打开注册界面（zhuce.fxml），隐藏登录界面，并为注册界面设置关闭事件监听器以返回登录界面
     */
    public void zhuce() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("zhuce.fxml"));
        Scene scene = null;
        try {
            scene = new Scene(fxmlLoader.load(), 600, 500);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        Stage zst = new Stage();
        zst.setTitle("注册");
        zst.setScene(scene);
        stage.hide();

        // 注册窗口关闭时回调函数，显示登录界面
        zst.setOnCloseRequest(event -> {
            event.consume();
            zst.close();
            stage.show();
        });
        zst.show();
    }

    /**
     * 显示忘记密码提示对话框，提示用户联系管理员处理
     */
    public void forget() {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("提示");
        alert.setHeaderText("忘记密码");
        alert.setContentText("请联系管理员");

        // 显示并等待用户关闭提示对话框
        alert.showAndWait();
    }

    // 静态引用注册界面舞台实例
    public static Stage zst;
}
